using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Novapangeia.Dominio;

namespace Novapangeia.Repositorio
{	
	public partial class RepositorioUsuario
	{	   
		
		private ISqlHelper sqlHelper;
		
		public  RepositorioUsuario(ISqlHelper _sqlHelper)
        {
            if (_sqlHelper == null)
                sqlHelper = new SqlHelper();
            else
                sqlHelper = _sqlHelper;
        }
		
		#region Parameters
		public static class Parameters
		{
			public static MySqlParameter Id
			{
				get
				{
					return new MySqlParameter("p_Id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Login
			{
				get
				{
					return new MySqlParameter("p_Login", MySqlDbType.VarChar, 10);
				}
			}
			
			public static MySqlParameter Senha
			{
				get
				{
					return new MySqlParameter("p_Senha", MySqlDbType.VarChar, 10);
				}
			}
			
			public static MySqlParameter General
			{
				get
				{
					return new MySqlParameter("p_General", MySqlDbType.VarChar, 45);
				}
			}
			
			public static MySqlParameter Cidade
			{
				get
				{
					return new MySqlParameter("p_Cidade", MySqlDbType.VarChar, 20);
				}
			}
			
			public static MySqlParameter Email
			{
				get
				{
					return new MySqlParameter("p_Email", MySqlDbType.VarChar, 50);
				}
			}
			
			public static MySqlParameter Coordenada_X
			{
				get
				{
					return new MySqlParameter("p_Coordenada_X", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Coordenada_Y
			{
				get
				{
					return new MySqlParameter("p_Coordenada_Y", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Score
			{
				get
				{
					return new MySqlParameter("p_Score", MySqlDbType.Int32, 0);
				}
			}
			
		}
		#endregion		
		
		public List<Usuario> ListarUsuarios() 
		{
			string sql = @"SELECT id, login, senha, general, cidade, email, coordenada_X, coordenada_Y, score FROM usuario";
					
			List<Usuario> entityList = new List<Usuario>();
			
			MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);
			
			Usuario entity;
			
			while (reader.Read())
            {
                entity = FillEntity(reader);
				entityList.Add(entity);
            }

            reader.Close();
			
			return entityList;
		}

        public List<Usuario> ListarComerciantesPoderosos()
        {
            string sql = @"SELECT        usuario.id, usuario.login, usuario.senha, usuario.general, usuario.cidade, usuario.email, usuario.coordenada_X, usuario.coordenada_Y, usuario.score
                            FROM            usuario INNER JOIN
                                                     estoque ON estoque.usuario_id = usuario.id
                            GROUP BY usuario.id
                            ORDER BY (SELECT count(*) FROM negociacao WHERE negociacao.usuario_ofertante = usuario.id AND negociacao.fechada = 1) DESC, estoque.ouro + estoque.comida + estoque.minerio + estoque.madeira DESC
                            LIMIT 10";

            List<Usuario> entityList = new List<Usuario>();

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);

            Usuario entity;

            while (reader.Read())
            {
                entity = FillEntity(reader);
                entityList.Add(entity);
            }

            reader.Close();

            return entityList;
        }

        public List<Usuario> ListarTop10Score()
        {
            string sql = @"SELECT        usuario.id, usuario.login, usuario.senha, usuario.general, usuario.cidade, usuario.email, usuario.coordenada_X, usuario.coordenada_Y, usuario.score
                            FROM            usuario
                            ORDER BY usuario.score DESC
                            LIMIT 10";

            List<Usuario> entityList = new List<Usuario>();

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);

            Usuario entity;

            while (reader.Read())
            {
                entity = FillEntity(reader);
                entityList.Add(entity);
            }

            reader.Close();

            return entityList;
        }

        public List<Usuario> ListarGeneraisPoderosos()
        {
            string sql = @"SELECT        usuario.id, usuario.login, usuario.senha, usuario.general, usuario.cidade, usuario.email, usuario.coordenada_X, usuario.coordenada_Y, usuario.score
                            FROM            usuario INNER JOIN
                                                     estoque ON estoque.usuario_id = usuario.id INNER JOIN
                                                     tropa ON usuario.id = tropa.usuario_id INNER JOIN
                                                     unidade ON tropa.id = unidade.tropa_id
                            GROUP BY usuario.id
                            ORDER BY SUM(unidade.quantidade) DESC, estoque.lancas + estoque.espadas + estoque.arcos DESC
                            LIMIT 10";

            List<Usuario> entityList = new List<Usuario>();

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);

            Usuario entity;

            while (reader.Read())
            {
                entity = FillEntity(reader);
                entityList.Add(entity);
            }

            reader.Close();

            return entityList;
        }
	
		//=================================================================
		//  Carrega apenas um registro, buscado pela chave primária
		//=================================================================
		public Usuario LoadByPrimaryKey(int Id)
		{
            string sql = @"SELECT id, login, senha, general, cidade, email, coordenada_X, coordenada_Y, score FROM usuario WHERE (id = @p_id)";

			MySqlParameter p;
			p = Parameters.Id;
			p.Value = Id;
		
			MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p } , CommandBehavior.SingleRow);
			
			Usuario usuario = new Usuario();
			
			if(reader.HasRows)
            {
				reader.Read();
				usuario = FillEntity(reader);
            }
            else
            {
                usuario = null;
            }

            reader.Close();
			
			return usuario;
		}
		
        private Usuario FillEntity(MySqlDataReader  reader)
        {
            Usuario newEntity = new Usuario();
			
			newEntity.Id = reader.GetInt32("Id");

			newEntity.Login = reader.GetString("Login");

			newEntity.Senha = reader.GetString("Senha");

			newEntity.General = reader.GetString("General");

			newEntity.Cidade = reader.GetString("Cidade");

			newEntity.Email = reader.GetString("Email");

			newEntity.Cordenada_X = reader.GetInt32("Coordenada_X");

			newEntity.Cordenada_Y = reader.GetInt32("Coordenada_Y");

			newEntity.Score = reader.GetInt32("Score");


            return newEntity;
        }
	
		public void CadastrarUsuario(Usuario u)
		{
            string sql = @"INSERT
	                        INTO usuario
	                        (
		                        login,
		                        senha,
		                        general,
		                        cidade,
		                        email,
		                        coordenada_X,
		                        coordenada_Y,
		                        score
	                        )
	                        VALUES
	                        (
		                        @p_login,
		                        @p_senha,
		                        @p_general,
		                        @p_cidade,
		                        @p_email,
		                        @p_coordenada_X,
		                        @p_coordenada_Y,
		                        @p_score
	                        )";

			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;

			p = Parameters.Login;
			p.Value = u.Login;
			parameters.Add(p);

			p = Parameters.Senha;
			p.Value = u.Senha;
			parameters.Add(p);

			p = Parameters.General;
			p.Value = u.General;
			parameters.Add(p);

			p = Parameters.Cidade;
			p.Value = u.Cidade;
			parameters.Add(p);

			p = Parameters.Email;
			p.Value = u.Email;
			parameters.Add(p);

			p = Parameters.Coordenada_X;
			p.Value = u.Cordenada_X;
			parameters.Add(p);

			p = Parameters.Coordenada_Y;
			p.Value = u.Cordenada_Y;
			parameters.Add(p);

			p = Parameters.Score;
			p.Value = u.Score;
			parameters.Add(p);


			sqlHelper.ExecuteSql(CommandType.Text, sql, parameters.ToArray());
		}
	
		public bool atualizarUsuario(Usuario entity)
		{
            string sql = @"UPDATE usuario
	                        SET
		                        login = @p_login,
		                        senha = @p_senha,
		                        general = @p_general,
		                        cidade = @p_cidade,
		                        email = @p_email,
		                        coordenada_X = @p_coordenada_X,
		                        coordenada_Y = @p_coordenada_Y,
		                        score = @p_score
	                        WHERE
		                        id = @p_id";

			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Id;
			p.Value = entity.Id;
			parameters.Add(p);

			p = Parameters.Login;
			p.Value = entity.Login;
			parameters.Add(p);

			p = Parameters.Senha;
			p.Value = entity.Senha;
			parameters.Add(p);

			p = Parameters.General;
			p.Value = entity.General;
			parameters.Add(p);

			p = Parameters.Cidade;
			p.Value = entity.Cidade;
			parameters.Add(p);

			p = Parameters.Email;
			p.Value = entity.Email;
			parameters.Add(p);

			p = Parameters.Coordenada_X;
			p.Value = entity.Cordenada_X;
			parameters.Add(p);

			p = Parameters.Coordenada_Y;
			p.Value = entity.Cordenada_Y;
			parameters.Add(p);

			p = Parameters.Score;
			p.Value = entity.Score;
			parameters.Add(p);


			return sqlHelper.ExecuteSql(CommandType.Text, sql, parameters.ToArray());	
		}
	
		public bool Delete(Usuario entity)
		{
            string sql = @"	DELETE
	                        FROM construcao
	                        WHERE
		                        id = @p_id";

			MySqlParameter p;
			p = Parameters.Id;
			p.Value = entity.Id;
  
			return sqlHelper.ExecuteSql(CommandType.Text, sql, new MySqlParameter[] { p });	
		}
		
        public bool ExisteCoordenada(int coordenada_X, int coordenada_Y)
        {
            string sql = "select * from usuario where coordenada_x = @p_Coordenada_X and coordenada_y = @p_Coordenada_Y";

            List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Coordenada_X;
			p.Value = coordenada_X;
			parameters.Add(p);

			p = Parameters.Coordenada_Y;
			p.Value = coordenada_Y;
			parameters.Add(p);

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, parameters.ToArray());

            bool resultado = reader.HasRows;

            reader.Close();

            return resultado;
        }

        public Usuario ConsultarPorNomeSenha(string login, string senha)
        {
            string sql = @"SELECT id, login, senha, general, cidade, email, coordenada_X, coordenada_Y, score FROM usuario WHERE (login = @p_login and senha = @p_senha)";

            List<MySqlParameter> parameters = new List<MySqlParameter>();

            MySqlParameter p;

            p = Parameters.Login;
            p.Value = login;
            parameters.Add(p);

            p = Parameters.Senha;
            p.Value = senha;
            parameters.Add(p);

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, parameters.ToArray(), CommandBehavior.SingleRow);

            Usuario entity = new Usuario();

            if (reader.HasRows)
            {
                reader.Read();
                entity = FillEntity(reader);
            }
            else
            {
                entity = null;
            }

            reader.Close();

            return entity;
        }

        public Usuario CarregarPorCordenadas(int coordenada_X, int coordenada_Y)
        {
            {
                string sql = "SELECT id, login, senha, general, cidade, email, coordenada_X, coordenada_Y, score from usuario where coordenada_x = @p_Coordenada_X and coordenada_y = @p_Coordenada_Y";

                List<MySqlParameter> parameters = new List<MySqlParameter>();

                MySqlParameter p;

                p = Parameters.Coordenada_X;
                p.Value = coordenada_X;
                parameters.Add(p);

                p = Parameters.Coordenada_Y;
                p.Value = coordenada_Y;
                parameters.Add(p);

                MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, parameters.ToArray());

                Usuario usuario = new Usuario();

                if (reader.HasRows)
                {
                    reader.Read();
                    usuario = FillEntity(reader);
                }
                else
                {
                    usuario = null;
                }

                reader.Close();

                return usuario;
            }
        }

        public bool CalcularScoreUsuarios()
        {
            return sqlHelper.ExecuteSql(CommandType.Text, "call sp_usuario_calcular_score");
        }
    }
}
